package com.huan.spring6.aop.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyFactory {
    //目标对象
    private Object target;
    public ProxyFactory(Object target) {
        this.target = target;
    }

    //返回代理对象
    public Object getProxy(){
        /**
         * Proxy.newProxyInstance()有三个参数
         * 第一个参数：ClassLoader loader 加载动态生成代理类的类加载器
         * 第二个参数：Class<?>[] interfaces 目标对象实现的所有接口的class类数组
         * 第三个参数：java.lang.reflect.InvocationHandler h 设置代理对象实现目标对象方法的过程
         */
        ClassLoader loader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler(){

            @Override
            public Object invoke(Object proxy, //代理对象
                                 Method method, //需要重写目标对象的方法
                                 Object[] args //对应method方法中的参数
            ) throws Throwable {
                //调用前
                System.out.println("[动态代理][日志] "+method.getName()+"，参数："+ Arrays.toString(args));
                //调用目标方法
                Object result = method.invoke(target, args);
                //调用后
                System.out.println("[动态代理][日志] "+method.getName()+"，结果："+ result);
                return result;
            }
        };
        return Proxy.newProxyInstance(loader,interfaces,invocationHandler);
    }
}
